var m_cur_sel_obj; // 当前选中对象
var m_cur_sel_obj_parent; // 当前选中的父对象
var m_cur_sel_obj_style; // 选中元素默认的style值
var m_cur_sel_obj_html; // 当前对象源码
var m_element_hide_mode = false; // 标记广告模式
var m_element_debug_mode = false; // 审查元素模式
var m_parent_objs = [];

// 绕过 Tampermonkey 检测
window.external.Tampermonkey = true

window.onclick = function(ev) {
    if(m_element_debug_mode === true){
        var e1 = ev || event; // 选中当前项
        var obj = e1.srcElement ? e1.srcElement: e1.target;
        obj = obj ? obj : ev;
        t_sel_start_element(obj)
    }
};

function t_sel_start_element(obj){
    t_change_element(obj)

    // 如果为元素隐藏 则读取所有父元素 进而使用seek快速定向父元素
    if(m_element_hide_mode === true){
        m_parent_objs = [];
        var p = obj;
        while(p != null && p.nodeName !== "BODY" && p.nodeName != "HTML"){
            m_parent_objs.push(p);
            p = p.parentNode;
        }
        window.webmx.log("aaa:" + m_parent_objs.length);
        window.webmx.m_elementhide_upstartitem(m_parent_objs.length)
    }
}
function t_change_element(obj){
    // 将上一个选中的元素切换为默认样式
    if (m_cur_sel_obj !== undefined && m_cur_sel_obj_html != null){
        if(m_cur_sel_obj_style === null) m_cur_sel_obj.removeAttribute("style");
        else m_cur_sel_obj.setAttribute("style",m_cur_sel_obj_style);
    }

    if(obj == null) return;

    m_cur_sel_obj = obj;
    m_cur_sel_obj_parent = m_cur_sel_obj.parentNode;

    m_cur_sel_obj2 = m_cur_sel_obj;
    m_cur_sel_obj_parent2 = m_cur_sel_obj_parent;

    // 记录当前选中的样式
    m_cur_sel_obj_style = obj.getAttribute("style");

    // 记录当前选中项目的源码
    m_cur_sel_obj_html = obj.outerHTML;

    // 审查元素则创建方块，广告过滤则隐藏
    if(m_element_debug_mode === true) {
        obj.style.backgroundColor = "#87CEFA";
        obj.style.borderStyle = "solid";
        obj.style.borderColor = "#6A5ACD";
        obj.style.borderWidth = "2px";

    }else if(m_element_hide_mode === true){
        obj.setAttribute("style","display:none!important");
    }
    window.webmx.m_elemenTools_SelContentChange(0,m_cur_sel_obj_html);
    window.webmx.m_elemenTools_SelContentChange(1,m_cur_sel_obj_parent.outerHTML);
    window.webmx.m_elemenTools_SelContentChange(2,m_cur_sel_obj2.outerHTML);
    window.webmx.m_elemenTools_SelContentChange(3,m_cur_sel_obj_parent2.outerHTML);
}


// 跳转到父元素
function m_to_parent(){
    t_change_element(m_cur_sel_obj_parent)
}


/**
 * 启用元素调试 审查元素
 * @param enable  true 开启 false 关闭
 */
function m_enable_elementdebug(enable) {
    m_element_debug_mode = enable;
    if (enable === false) {
        if (m_cur_sel_obj !== undefined && m_cur_sel_obj_html != null){
            // 如果改成了 display:none!important (元素被隐藏掉了) 则不管他 否则恢复原样
            if(m_cur_sel_obj.getAttribute("style") != "display:none!important"){
                if(m_cur_sel_obj_style === null) m_cur_sel_obj.removeAttribute("style");
                else m_cur_sel_obj.setAttribute("style",m_cur_sel_obj_style);
            }
        }
    }else{
        // 若此时也开启了标识广告，则先关闭广告标识功能
        if(m_element_hide_mode === true) {
            m_enable_elementhide(false);
        }
    }
}

/**
 * 禁用元素审查工具
 */
function t_disable_element_inspect() {
    m_element_debug_mode = false;
    m_enable_elementdebug(false);
    window.webmx.log("元素审查工具已关闭");
}

/**
 * 元素隐藏
 * @param mode true 开启 false 关闭
 */
function m_enable_elementhide(enable){
    m_element_hide_mode = enable
    if(enable === false){
        if (m_cur_sel_obj !== undefined && m_cur_sel_obj_html != null){
            if(m_cur_sel_obj_style == null) m_cur_sel_obj.removeAttribute("style");
            else m_cur_sel_obj.setAttribute("style",m_cur_sel_obj_style);
        }
    }else{
        // 若此时也开启了标识广告，则先关闭审查元素工具
        if(m_element_debug_mode === true){
            m_enable_elementdebug(false)
        }
    }
}

/**
 * 改变隐藏位置 seek 位置改变
 * @param {Int} objIndex m_parent_objs 索引
 */
 function m_chanegHideElementIndex(objIndex){
    if(objIndex >= 0 && objIndex < m_parent_objs.length){
        t_change_element(m_parent_objs[objIndex]);

        // 如果选中项目没有标记属性（class  id） 则取上一级

        var t = ""
        var i = objIndex;
        while(i < m_parent_objs.length){
            var eln = m_parent_objs[i].nodeName;
            var elattr = getCssElementAttr(m_parent_objs[i]);
            if(elattr != null) eln += elattr;
            if(t == "") {
                t = eln;
            }else{
                t = eln + ">" + t;
            }
            if(elattr == null){
                i++;
            }else{
                i = m_parent_objs.length
            }
        }

        window.webmx.m_changeHideElementRule(t.toLowerCase());
    }
}
function getCssElementAttr(obj){
    var t = obj.getAttribute("id");
    if(t != null)   return "#" + toCss2(t) ;

    t = obj.getAttribute("class");
    if(t != null)   return "." + toCss2(t) ;

    return null;
}
function toCss2(t){
    var ls = t.split(" ");
    var tt = ""
    ls.forEach(function(value){
        if(value != ""){
            tt += "," + value
        }
    })
    tt = tt.substring(1);
    return tt;
}



// 编辑内容  str String 更换的html文本
function m_edit_cur_html(str){
    if(m_cur_sel_obj != null){
        m_cur_sel_obj.outerHTML = str;
         window.webmx.log(m_cur_sel_obj.outerHTML);
        m_cur_sel_obj_html = null
        t_change_element(m_cur_sel_obj)
    }
}

/**
 * 根据节点路径编辑特定元素
 * @param {String} path 节点路径，格式为"1-2-3"表示第1个节点的第2个子节点的第3个子节点
 * @param {String} html 要替换的HTML内容
 * @returns {Boolean} 是否成功编辑
 */
function m_edit_element_by_path(path, html) {
    window.webmx.log("开始编辑节点，路径: " + path);
    
    if(!m_cur_sel_obj) {
        window.webmx.log("没有选中的元素");
        return false;
    }
    
    // 如果是根节点路径，直接编辑当前选中元素
    if(!path || path === "" || path === "1") {
        window.webmx.log("编辑根节点");
        m_edit_cur_html(html);
        return true;
    }
    
    try {
        // 解析路径
        const pathParts = path.split("-");
        window.webmx.log("解析节点路径: " + JSON.stringify(pathParts));
        
        // 从当前选中元素开始查找
        let currentElement = m_cur_sel_obj;
        let currentDoc = currentElement;
        
        window.webmx.log("当前选中元素: " + currentElement.tagName);
        
        // 跳过第一个索引，因为1表示根节点（当前选中元素）
        for(let i = 1; i < pathParts.length; i++) {
            const index = parseInt(pathParts[i]);
            window.webmx.log("查找子节点索引: " + index);
            
            // 获取所有子节点（包括元素节点和文本节点）
            let childNodes = [];
            
            // 收集所有有效的子节点（跳过空白文本节点）
            for(let j = 0; j < currentDoc.childNodes.length; j++) {
                const node = currentDoc.childNodes[j];
                // 跳过空白文本节点
                if(node.nodeType === 3 && node.textContent.trim() === "") {
                    continue;
                }
                childNodes.push(node);
                window.webmx.log("子节点 " + j + ": " + (node.tagName || "文本节点"));
            }
            
            window.webmx.log("有效子节点数量: " + childNodes.length);
            
            // 检查索引是否有效
            if(index >= childNodes.length) {
                window.webmx.log("无效的节点路径: " + path + "，索引越界: " + index + "，最大索引: " + (childNodes.length - 1));
                return false;
            }
            
            // 获取指定索引的子节点
            currentDoc = childNodes[index];
            window.webmx.log("找到子节点: " + (currentDoc.tagName || "文本节点"));
        }
        
        // 保存原始HTML用于对比
        const originalHtml = currentDoc.outerHTML;
        window.webmx.log("原始HTML长度: " + originalHtml.length);
        window.webmx.log("替换HTML长度: " + html.length);
        
        // 替换找到的元素
        currentDoc.outerHTML = html;
        window.webmx.log("成功编辑路径为 " + path + " 的元素");
        
        // 更新当前选中元素的HTML（因为它可能已经改变）
        if(m_cur_sel_obj) {
            m_cur_sel_obj_html = m_cur_sel_obj.outerHTML;
            // 重新选中元素，更新UI
            t_change_element(m_cur_sel_obj);
        }
        
        return true;
    } catch(e) {
        window.webmx.log("编辑元素时出错: " + e.message);
        return false;
    }
}

// -- 审查元素，只取内容，不做界面处理  元素检索工具中使用
var m_cur_sel_obj2; // 隐藏的选中项
var m_cur_sel_obj_parent2; // 隐藏选中的父对象
function mbrowser_element_getPatent2() {
    m_cur_sel_obj2 = m_cur_sel_obj_parent2;
    m_cur_sel_obj_parent2 = m_cur_sel_obj2.parentNode;
    win_echo();
}


function debug_inin(){
    window.webmx.readyState('scriptEnd');
    m_iframe();
}
debug_inin();

// ********************************************************************



/**
 * 读取iframe数
 */
function m_iframe(){
    var arr = document.getElementsByTagName('iframe');
    var size = 0
    for(var i = 0; i < arr.length; i++){
        var tag = arr[i];
        if(tag.offsetWidth > 10) {
            size = tag.offsetWidth;
            break;
        }
    }
    // window.webmx.iframex(size)
}

var m_element_hide_rules = [];
var e_is_read_element_rule_ing = false; // 广告过滤判断状态，若判断中则不进行处理

function webmx_hideElement() {
    if(e_is_read_element_rule_ing == true){return false;}
    if(m_element_hide_rules == null || m_element_hide_rules.length == 0){
        e_is_read_element_rule_ing = true;
        m_element_hide_rules = window.webmx.getAdblockElement().split("\n");
        e_is_read_element_rule_ing = false;
    }
	var webmx_eqRules = [];
	for (var i = 0; i < m_element_hide_rules.length; i++) {
		var v = m_element_hide_rules[i];
        if(v == undefined || v == null || v == "") continue;
		var els = document.querySelectorAll(v);
		if (els.length != 0) {
			webmx_eqRules.push(v);
		    els.forEach(function(el) {
				el.setAttribute("style", "display:none!important");
			})
		}
	}
	window.webmx.m_hide_rule_callback(webmx_eqRules.join("\n"))
    m_code_length = document.getElementsByTagName('html')[0].innerHTML.length;
    return true;
};

var m_code_length = 0
function checkChange(){
    var length = document.getElementsByTagName('html')[0].innerHTML.length;
    if(Math.abs(length - m_code_length) > 1000){
        m_code_length = length
        webmx_hideElement()
    }
}


/* tm */
function GM_xmlhttpRequest(a) {
    if(!a.url){
        a.onerror();
        return;
    }

    var url = a.url;
    var timeout = 0;
    if(!(!a.timeout)) timeout = a.timeout;

    var method = "GET";
    if(!(!a.method)) method = a.method;

    var data = "";
    if(!(!a.data)) data = JSON.stringify(a.data);

    var headers = "";
    if(!(!a.headers)) headers = JSON.stringify(a.headers);

    var responseType;
    if(!(!a.responseType)) responseType =  a.responseType;

    var code = "";
    code = window.webmx.xmlhttprequest(timeout,method,url,data,headers,responseType);

    if(code === "ontimeout"){
        a.ontimeout();
    }else if(code === "404"){
        a.onerror();
    }else{
        var pr = JSON.parse(code);
        pr.responseText = pr.response;
        a.onload(pr);
    }
}

function GM_addStyle(css){
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}

function GM_openInTab(url) {
    GM_openInTab(url,true);
}

function GM_openInTab(url,newWindow) {
    window.webmx.openUrl(url);
}


window.webmx.childrenLength(document.body.children.length)

